#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=1e5+5;
const int maxm=1e5+5;
int t;
int n,m,l,v;
int d[maxn],v0[maxn],a[maxn];
int p[maxm];
struct node{
    int a,b;
}num[maxn],x[maxm],vis[maxn];
int pre[maxm];

int erfen1(int l,int r,int a,int v0,int d){
    if(l-r==-1){
        int nv=2*a*(p[l]-d)+v0*v0;
        if(nv>v)
        return l;
        else {
            int nv=2*a*(p[r]-d)+v0*v0;
            if(nv>v)
            return r;
            else return m+1;
        }
    }
    int mid=(l+r)/2;
    int nv=2*a*(p[mid]-d)+v0*v0;
    if(nv>v) return erfen1(l,mid,a,v0,d);
    else return erfen1(mid,r,a,v0,d);
}
int erfen2(int l,int r,int a,int v0,int d){
    if(l-r==-1){
        int nv=2*a*(p[r]-d)+v0*v0;
        if(nv>v)
        return r;
        else {
            int nv=2*a*(p[l]-d)+v0*v0;
            if(nv>v)
            return l;
            else return -1;
        }

    }
    int mid=(l+r)/2;
    int nv=2*a*(p[mid]-d)+v0*v0;
    //if(nv==v) return mid-1;
    if(nv<=v) return erfen2(l,mid,a,v0,d);
    else return erfen2(mid,r,a,v0,d);
}
int erfen3(int l,int r,int d){
    if(l-r==-1){
        if(p[l]>=d)
        return l;
        else if(p[r]>=d)return r;
        else return r+1;
    }
    int mid=(l+r)/2;
    if(p[mid]>=d) return erfen3(l,mid,d);
    else return erfen3(mid,r,d);
}

bool cmp(node A,node B){
    if(A.b<B.b) return true;
    else if(A.b==B.b&&A.a<B.a) return true;
    else return false;
}

signed main(){
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    cin>>t;
    while(t--){
    cin>>n>>m>>l>>v;
    v=v*v;
    for(int i=1;i<=n;i++){
        cin>>d[i]>>v0[i]>>a[i];
    }
    for(int i=1;i<=m;i++){
        cin>>p[i];
    }
    sort(p+1,p+m+1);
    for(int i=1;i<=n;i++){
        if(a[i]>0){
            num[i].b=m;
            num[i].a=max(erfen3(1,m,d[i]),erfen1(1,m,a[i],v0[i],d[i]));
        }else if(a[i]<0){
            num[i].b=erfen2(1,m,a[i],v0[i],d[i]);
            num[i].a=erfen3(1,m,d[i]);
        }else if(a[i]==0){
            if(v0[i]*v0[i]>v){
                num[i].a=erfen3(1,m,d[i]);
                num[i].b=m;
            }else{
                num[i].b=1;
                num[i].a=m;
            }

        }
    }

    int ans=0;
    for(int i=1;i<=n;i++){
        if(num[i].a<=num[i].b) ans++;
        //cout<<num[i].a<<' '<<num[i].b<<endl;
    }
    cout<<ans<<' ';
    //cout<<endl;

    /*
    for(int i=1;i<=n;i++){
        for(int j=num[i].a;j<=num[i].b;j++){
            x[j].a=min(x[j].a,num[i].a);
            x[j].b=max(x[j].b,num[i].b);
        }
    }

    sort(x+1,x+m+1,cmp);

    for(int i=1;i<=m;i++){
        cout<<x[i].a<<' '<<x[i].b<<endl;
    }
    cout<<endl;
*/
    sort(num+1,num+n+1,cmp);
    //for(int i=1;i<=n;i++){
     //   cout<<num[i].a<<' '<<num[i].b<<endl;
    //}
    //cout<<endl;
    int cnt=0;int i=1;int j=1;
    while(i<=n&&j<m){
        while(num[i].a>num[i].b){
            i++;
            continue;
        }
        j=num[i].b;
        //cout<<j<<endl;
        while(num[i].a<=j&&i<=n) i++;
        cnt++;
    }
    cout<<m-cnt;
    cout<<endl;
    }

    return 0;
}
